const sql = require('./sql');
const { keysToCamelCase } = require('./utils');

/**
 * 获取个人信息接口
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
const getProfile = async (req, res) => {
  const { userId } = req.query;

  try {
    // 1. 验证必填字段
    if (!userId) {
      return res.status(400).json({ 
        success: false,
        code: 400,
        message: '缺少用户ID参数' 
      });
    }

    // 2. 查询用户信息
    const users = await sql.getUserById(userId);
    
    if (!users || users.length === 0) {
      return res.status(404).json({ 
        success: false,
        code: 404,
        message: '用户不存在' 
      });
    }

    const user = users[0];

    // 3. 移除密码字段（安全考虑）
    const { password, ...userDataWithoutPassword } = user;

    // 4. 将字段名转换为小驼峰格式
    const camelCaseData = keysToCamelCase(userDataWithoutPassword);

    // 5. 返回成功响应（返回所有字段，除了密码）
    res.status(200).json({
      success: true,
      code: 200,
      message: '获取个人信息成功',
      data: camelCaseData
    });

  } catch (error) {
    console.error('获取个人信息错误:', error);
    res.status(500).json({ 
      success: false,
      code: 500,
      message: '服务器错误，请稍后再试' 
    });
  }
};

/**
 * 修改个人信息接口
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
const updateProfile = async (req, res) => {
  const { userId, nickName, oldPassword, newPassword } = req.body;

  try {
    // 1. 验证必填字段
    if (!userId) {
      return res.status(400).json({ 
        success: false,
        code: 400,
        message: '缺少用户ID参数' 
      });
    }

    // 2. 检查用户是否存在
    const users = await sql.getUserById(userId);
    if (!users || users.length === 0) {
      return res.status(404).json({ 
        success: false,
        code: 404,
        message: '用户不存在' 
      });
    }

    // 3. 准备更新数据
    const updateData = {};

    // 如果要修改昵称
    if (nickName !== undefined && nickName !== null && nickName !== '') {
      // 验证昵称长度（1-50个字符）
      if (nickName.length > 50) {
        return res.status(400).json({ 
          success: false,
          code: 400,
          message: '昵称长度不能超过50个字符' 
        });
      }
      updateData.nickName = nickName;
    }

    // 如果要修改密码
    if (newPassword) {
      // 必须提供旧密码
      if (!oldPassword) {
        return res.status(400).json({ 
          success: false,
          code: 400,
          message: '修改密码需要提供旧密码' 
        });
      }

      // 验证新密码强度（至少6个字符）
      if (newPassword.length < 6) {
        return res.status(400).json({ 
          success: false,
          code: 400,
          message: '新密码长度至少为6个字符' 
        });
      }

      // 验证旧密码是否正确（需要查询完整的用户信息包括密码）
      const query = `SELECT password FROM sys_user WHERE user_id = ?`;
      const operations = require("./db-operations");
      const pool = new operations();
      const userWithPassword = await pool.query(query, [userId]);
      
      if (!userWithPassword || userWithPassword.length === 0) {
        return res.status(404).json({ 
          success: false,
          code: 404,
          message: '用户不存在' 
        });
      }

      // 验证旧密码
      if (userWithPassword[0].password !== oldPassword) {
        return res.status(401).json({ 
          success: false,
          code: 401,
          message: '旧密码不正确' 
        });
      }

      // 使用bcrypt加密密码（生产环境推荐）
      // const hashedPassword = await bcrypt.hash(newPassword, 10);
      
      // 注意：当前项目使用明文密码，为保持一致性，这里也使用明文
      // 生产环境强烈建议使用bcrypt加密
      updateData.password = newPassword;
    }

    // 4. 检查是否有需要更新的字段
    if (Object.keys(updateData).length === 0) {
      return res.status(400).json({ 
        success: false,
        code: 400,
        message: '没有需要更新的信息' 
      });
    }

    // 5. 更新用户信息
    await sql.updateUserInfo(userId, updateData);

    // 6. 查询更新后的用户信息
    const updatedUsers = await sql.getUserById(userId);
    const updatedUser = updatedUsers[0];

    // 7. 移除密码字段（安全考虑）
    const { password: pwd, ...updatedUserData } = updatedUser;

    // 8. 将字段名转换为小驼峰格式
    const camelCaseData = keysToCamelCase(updatedUserData);

    // 9. 返回成功响应（返回所有字段，除了密码）
    res.status(200).json({
      success: true,
      code: 200,
      message: '修改个人信息成功',
      data: camelCaseData
    });

  } catch (error) {
    console.error('修改个人信息错误:', error);
    
    // 其他服务器错误
    res.status(500).json({ 
      success: false,
      code: 500,
      message: '服务器错误，请稍后再试' 
    });
  }
};

module.exports = { 
  getProfile,
  updateProfile 
};

